約 2,895,599 件
https://w.atwiki.jp/2dtales/pages/166.html
https://w.atwiki.jp/hmiku/pages/51476.html
【検索用 YUMMYNABE#1 登録タグ A4。CD AzeCD CD CDY Füga-FücaCD Hajime YamamotoCD LITCHICD MizoreCD REDCD logicoCD miruCD s!onCD キツネリCD ハイノミCD ハグミーCD ヒロモトヒライシンCD 匿名ゲルマCD 大漠波新CD】 + 目次 目次 CD紹介 曲目 リンク コメント 前作 本作 次作 - YUMMY-NABE #1 CAN LUCK GUY #2 匿名ゲルマ 大漠波新 キツネリ ⌘ハイノミ ハグミー ヒロモトヒライシン A4。 logico miru Mizore RED Yamaji Füga-Füca 流通 即売 全国 配信 発売 2022年11月12日 2022年11月12日 価格 ¥2,500 ¥2,500 サークル GaL CD紹介 CD名:『YUMMY-NABE #1』 「曲名ぜんぶ闇鍋に入れたい具材にしたらおもろくねw」のコンセプトのもと制作されたコンピレーションアルバム。 Artwork s!on Mastering Hajime Yamamoto Movie Aze , グミ山(キツネリ) 曲目 GOAT/大漠波新 天使の翼。 (YUMMY-NABE mastering)/A4。 クラフトソーダ・クラフト/miru 赤色3号 (YUMMY-NABE mastering)/キツネリ Locust (YUMMY-NABE mastering)/Yamaji マッシュルーム/ハグミー バタースコッチ (YUMMY-NABE mastering)/Füga-Füca 翠牛/Mizore ハルシオン/RED 喉に刺さる骨/ヒロモトヒライシン DOGS (YUMMY-NABE mastering)/⌘ハイノミ 薄荷/logico 〆/匿名ゲルマ リンク BOOTH コメント 〆までの流れが素晴らしい() -- 名無しさん (2023-11-08 20 40 23) 名前 コメント
https://w.atwiki.jp/thecockrockshockpop/pages/2209.html
大薮麻琴(vo), 家永陽介(g), キリ(b), 矢野祐樹(sax), エガシラリョウ(ds)
https://w.atwiki.jp/rouga/pages/6.html
Emacsen and others note. 常用のEditerであるNTEmacs xyzzyの備忘録です。 Emacsen and others note. NTEmacs xyzzy Meadow GIMP2 for Windows NTEmacs Matsutan氏のページよりBinaryで入手。 Matsutan氏による半透明化パッチが当ててあり、なんだかおもしろい。 .emacs に(setq w32-transparency-alpha n%)と記述することでn%でのWindow透過ができる。 また、日本語FontにIPAフォント使用。 独立行政法人情報処理推進機構・・・ですか。 なかなか面白いことをやっているところがあるもんですね。 また、C#用にcsharp-mode.el導入。 C#のコーディングにしか使っていなかったから気がつかなかった(ろくにコメント記述せずにコーディングしてるから^^;)けど、ぱくってきた.emacsだと日本語フォントが盛大にずれる。 これ直すの大変そうだな・・・。 xyzzy Windows向けのEmacsのようなエディタ。 何にしろEmacsのくそ重さはどうにもならず、自宅で使っているPC(Athlon64)ほど力のない事務所で使っているPCでは仕事にならないので導入。 初期状態でC#-Modeを持っていて結構便利。 もう一つ特筆できるのがEmacs同様Buffer内にShellを扱うことができること。 Emacsを使ったことがないとなんだそりゃ、な話だが、要はメモ帳の表示を使ってコマンドプロンプトが表示 操作できる。 C#の勉強にベータ版のVisualC#2005Expressも導入しているが、いきなり統合環境からだと便利すぎて言語そのものがわけわからん状態になるのでコマンドラインからのコンパイラを使うことが多い。 cmd.exeからnotepad hogehoge.csとしてコードを扱うのもよいが、インデントやらマークアップやらが使用できないのはやはりつらい。 正規表現での検索機能などもあり、使い込むととても便利そうである。 Meadow Windows上のEmacs実装の一つ。 細かいことは解説ページに任すが、日本語TrueTypeFontの利用、BDFの利用が標準で添付される.emacsで設定できる。 ダウンロードはこちら。 またMeadowについてのWikiもあり、こちらから様々な情報にアクセスできる。 Emacsの仲間の割には苦労することもなくセットアップできるので特別書くことはあまりない(笑 GIMP2 for Windows ここのページの画像処理をするために導入した有名なフリー画像処理アプリケーション。 WindowsXPsp2だとScript-Fu.exeがクラッシュするためこちらより修正済みScript-Fu.exeと入れ替え。
https://w.atwiki.jp/cupnes/pages/28.html
Helmのインストール Anythingの無効化 .emacsからコメントアウト ;; ;; anything.elの設定 ;; (require anything-startup) Helmのダウンロード・ビルド $ cd ~/site-lisp/ $ git clone https //github.com/emacs-helm/helm.git $ cd helm/ $ make .emacsへ追加 以下を追加 ;; Helmの設定 (add-to-list load-path "~/site-lisp/helm") (require helm-config) 参考 https //github.com/emacs-helm/helm http //d.hatena.ne.jp/tomoya/20130519/1368942603 面白そうな記事のまとめ Software Design連載記事「Emacsのトラノマキ」の原稿 GNU GLOBALの設定 $ cp /usr/local/share/gtags/gtags.el ~/site-lisp/ 以下を~/.emacsに追記 ;; GNU GLOBAL(gtags.el)の設定(ここから) (add-to-list load-path "~/site-lisp") (autoload gtags-mode "gtags" "" t) (setq gtags-mode-hook (lambda () (local-set-key "\M-t" gtags-find-tag) (local-set-key "\M-r" gtags-find-rtag) (local-set-key "\M-s" gtags-find-symbol) (local-set-key "\C-t" gtags-pop-stack))) (add-hook gtags-select-mode-hook (lambda () (setq hl-line-face underline) (hl-line-mode 1))) (add-hook c-mode-hook (lambda () (gtags-mode 1) (gtags-make-complete-list))) ; Customization (setq gtags-suggested-key-mapping t) (setq gtags-auto-update t) ;; GNU GLOBAL(gtags.el)の設定(ここまで) 参考 http //d.hatena.ne.jp/higepon/20060107/1136628498 c-modeのタブ幅(インデント幅)設定 (setq c-default-style "linux" c-basic-offset 4) http //www.emacswiki.org/emacs/IndentingC auto-complete-mode.el http //cx4a.org/software/auto-complete/index.ja.html c-modeの自動インデント有効化/無効化 C-c C-lで切り替え デフォルトで無効化する場合は以下を.emacsに追加 (add-hook c-mode-hook (lambda () (c-toggle-electric-state -1))) 参考 http //d.hatena.ne.jp/syohex/20110624/1308871777 導入したいemacs設定 http //shibayu36.hatenablog.com/entry/2012/12/29/001418 auto-install.el 「〜.el」のスクリプトを追加する際の ダウンロード 保存 バイトコンパイル ロード を自動化する 1. auto-install.elをダウンロード、保存 http //www.emacswiki.org/emacs/download/auto-install.el からダウンロードして、load-pathの通った場所に配置し、バイトコンパイル コマンドライン上で行う場合は以下のように行える $ mkdir -p ~/.emacs.d/auto-install $ cd ~/.emacs.d/auto-install $ wget http //www.emacswiki.org/emacs/download/auto-install.el $ emacs --batch -Q -f batch-byte-compile auto-install.el 2. .emacsに設定を追加 (add-to-list load-path (expand-file-name "~/.emacs.d/auto-install")) (require auto-install) (auto-install-update-emacswiki-package-name t) (auto-install-compatibility-setup) (setq ediff-window-setup-function ediff-setup-windows-plain) Emacsでちょっとずつスクロールする http //hitode909.hatenablog.com/entry/20100525/1274771578 タブ幅を変更する 例)タブ幅を半角スペース4個分にする (setq-default tab-width 4) (setq default-tab-width 4) (setq tab-stop-list (4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120)) 参考: http //masutaka.net/chalow/2009-07-10-4.html ある特定の色設定を編集する 例えば、sh-modeのヒアドキュメントの色設定が見難いなどの場合 設定を変更したいモードをバッファに開いた状態で以下のコマンドを実行 M-x list-faces-display 編集したい色にカーソルを合わせてEnter そして、編集後は [Save for future sessions] を選択することで、設定ファイルに保存してくれる 必要に応じてColor Themeを変更する ~/site-lisp/color-theme-6.6.0/ にColor Themeが展開されているとする。 ロード M-x load-file Load file ~/site-lisp/color-theme-6.6.0/color-theme.el 初期化 M-x color-theme-initialize テーマ設定 (color-theme-dark-laptopのテーマを設定する場合) M-x color-theme-dark-laptop 参考 http //openlab.dino.co.jp/2008/07/04/222725288.html 文字サイズを変える 自分の環境では以下でできた。 文字を大きく C-x C-; 文字を小さく C-x C-- デフォルトのサイズに戻す C-x C-0 参考 http //tkmsaoi.hatenablog.com/entry/2012/09/05/232904 view-modeのキーバインド (require view) (define-key view-mode-map (kbd "N") View-search-last-regexp-backward) (define-key view-mode-map (kbd "?") View-search-regexp-backward) (define-key view-mode-map (kbd "G") View-goto-line-last) (define-key view-mode-map (kbd "b") View-scroll-page-backward) (define-key view-mode-map (kbd "f") View-scroll-page-forward) (define-key view-mode-map (kbd "h") backward-char) (define-key view-mode-map (kbd "j") next-line) (define-key view-mode-map (kbd "k") previous-line) (define-key view-mode-map (kbd "l") forward-char) (define-key view-mode-map (kbd "J") View-scroll-line-forward) (define-key view-mode-map (kbd "K") View-scroll-line-backward) 読み取り専用時には「view-mode」を使用する (setq view-read-only t)
https://w.atwiki.jp/fallout_jp/pages/473.html
# (846) guy that Gus designed to point you around {1099}{}{?} {1199}{}{ [この人が教えられることはない]} #{100}{}{You see a shifty looking character.} {100}{}{ 胡 散 臭 い な り の 人 物 だ} # float #{101}{}{Pssst! Come ere.} {101}{}{ シーッ!こっちだ。} #{102}{}{So a, whatcha doin in the Hub?} #{103}{}{I don t really see where that is any of your business.} #{104}{}{Why?} #{105}{}{Looking for something that I need.} #{106}{}{Where my Mommie?!?} {102}{}{ んで、Hubで何やってんだ。} {103}{}{ これっぽっちもお前に関係ないだろう。} {104}{}{ なんだ?} {105}{}{ 探し物がある。} {106}{}{ おかーちゃんどこ?!?} #{107}{}{Not really sure big fella. I ll see ya around.} #{108}{}{Ahh.} {107}{}{ さあな分からんよ、あんちゃん。またな。} {108}{}{ あー} #{109}{}{No sweat off my back. Just seein if I could be neighborly like. [Lemmy turns away]} {109}{}{ そんな言い方すんなよ。親切にしてやろうと思っただけじゃねーか。 [Lemmyはそっぽを向いた]} #{110}{}{Well, you look like a businessman. And I m a businessman, # and I thought we could, ah, discuss, ah, business.} #{111}{}{Well, what do you do around here?} #{112}{}{I think I m just going to give you the business!} #{113}{}{I don t think I want to have anything to do with your "business".} {110}{}{ んー、なんか商用って感じなんだよな。俺もそうなんだ。なもんで、 あー、話でもできないかと、あー、仕事の話な。} {111}{}{ で、そちらはこの辺りで何を?} {112}{}{ 丁度ぶっ殺してやろうと思ってたところでな!} {113}{}{ お前の「仕事」とやらには一切関わりたくないんでね。} #{114}{}{Well, we all got needs. I might be able to help # with some of em. So what sort of needs do you got?} #{115}{}{Well, I m really looking for a Water Chip. I need to get one back to my people.} #{116}{}{Needs, huh? I understand needs, but what might you know about satiating these needs?} #{117}{}{I have need of some information.} #{118}{}{I certainly don t need anything you might be talking about.} {114}{}{ あー、誰しも欲しいもんがあるわな。多少なりとも力を貸せるかもし れんぞ。で、どういったもんを探してるんだ?} {115}{}{ 実はウォーターチップを探している。私の町のために1つ持って帰 らねばならないんだ。} {116}{}{ 欲しいもん、ねえ。目当ての物はあるが、そちらに一体何ができる というんだ?} {117}{}{ 知りたいことがある。} {118}{}{ そういうの本当にいらないから。} #{119}{}{I do a little bit of this, and a little bit of that. # I get things and information for people, # whatever they might need or be lookin for.} #{120}{}{Well, I do need some things.} #{121}{}{Anything you can tell me about specifically?} #{122}{}{I m looking for a Water Chip. You wouldn t happen to have one, would you?} #{123}{}{I ll see you later.} {119}{}{ 何やかんや広く浅くやってる。物だろうが情報だろうが、欲しいもの 探しものはなんでも用意してやるよ。} {120}{}{ ほしい物がある。} {121}{}{ 具体的にどういう話ができるんだ。} {122}{}{ ウォーターチップを探している。まさか持ってたりしないよな。} {123}{}{ また今度。} #{124}{}{Water Chip, hmmmm. Don t think I ve heard of one of those things. If I s was you, # I d try the Water Merchants. They got a grip on all the water around here.} #{125}{}{So what do you do around here?} #{126}{}{So what else might you know about?} #{127}{}{Thanks for the information.} {124}{}{ ウォーターチップ、うーん。ちょっと聞いたこともねーな。俺だった らWater Merchantsのところに行ってみるぞ。この辺 りの水は全て連中が握ってるからな。} {125}{}{ で、そちらはこの辺りで何を?} {126}{}{ 他に何か知りませんか。} {127}{}{ 教えてくれてありがとう。} #{128}{}{Not a problem. If there s anything else you might # be wanting, you come and talk to Lemmy first.} {128}{}{ 分かった。他に何かほしい物ができたら、まずはLemmyに声をか けてくれよ。} #{129}{}{So, you re lookin for information, huh? Being a # respectable businessman, I gots overhead, so I ll # need a few caps to tell you what you need to know. Now that # we got that straight, whattcha wanna know about?} {129}{}{ おー、知りたいことがあるってんだな?ごくまっとうな商売人として は必要経費ってもんがあってな。情報料として数ドル頂くことになっ てんだ。さっ、そこんところはっきりさせたところで、何が知りたい のか聞こうか。} #{130}{}{So, you think I might know a little more about those # Water Chip things, huh? Well, you might be right. # It s gonna cost you, though. I think 500 bottle caps oughta do it.} #{131}{}{Alright, what s the info?} #{132}{}{I ll give you 400 instead.} #{133}{}{I think you need to tell me, right now, and without the freakin caps!} #{134}{}{Too rich for my blood.} {130}{}{ ほー、そのウォーターチップとやらについてまだ話していないことが あると?うむ、そうかもな。ただ金はもらうぞ。500ドルでいいだ ろう。} {131}{}{ よし、話してくれ。} {132}{}{ 400なら出そう。} {133}{}{ 今すぐ話してもらおうか。ただし、そんな大金払わん。} {134}{}{ 高過ぎだ。} #{135}{}{Now, now. I wouldn t be the man I am if I gave information away for less than it s # worth. Come back when you ve got the caps.} {135}{}{ いやいやいや、見合うだけの代価も受け取らずに教えてやるなんて俺 のやり方じゃねーんでな。金ができたらまた来てくれや。} #{136}{}{Trying to intimidate poor old Lemmy, huh? Well, I s not afraid of the likes of you. # I ll just be seein you around.} {136}{}{ この哀れなLemmyおじさんを脅そうってのか、え?へっ、おめえ のような奴にビビるかよ。じゃーな、アバヨ。} #{137}{}{[Lemmy takes your money]} {137}{}{ [Lemmyに金を渡した]} #{138}{}{Well, that s fair enough. I ll take that instead.} {138}{}{ うむ、文句はねえ。その額でいいぞ。} #{139}{}{Ok, Ok, Ok, see I was just kidding about paying for the info. Good joke, huh?} {139}{}{ 分かった分かった分かった。金云々はただの冗談だって。面白かった だろ?} #{140}{}{Well, so here s what I know about the Water Chips. # The thing I ve heard is that they all used # to come from the Vaults. So if I was lookin for one, # I d find out where the rest of these Vaults were. # I m not sure where all the Vaults are exactly, but I ve # heard that there are about 4 around here somewhere s.} #{141}{}{I want to ask you a few more questions.} #{142}{}{Thanks.} {140}{}{ よし、じゃあウォーターチップについて知っていることを話そう。聞 いた話じゃあチップは全てVaultからもたらされたもんらしい。 探すんだったら、まずはそういうVault跡を見つけるな。正確な 場所までははっきり分からんが、この周辺には4箇所ほどあるらしい ぜ。} {141}{}{ もう少し聞きたいことがある。} {142}{}{ ありがとう。} #{143}{}{Sure, what else do you want to know about?} {143}{}{おう、他に何が知りたいんだ。} # op #{144}{}{Anything you know about Water Chips that you can tell me?} #{145}{}{What do you know about Decker?} #{146}{}{Do you know anything about the missing caravans?} #{147}{}{Well, I m looking for a certain commodity, if you know what I mean.} #{148}{}{Nothing right now.} {144}{}{ ウォーターチップについて他に話せることはないか。} {145}{}{ Deckerのことを教えてくれ。} {146}{}{ 行方不明になっているキャラバンについて何か知らないか。} {147}{}{ ちょっと探しているブツがある、分かるよな。} {148}{}{ 今は特にない。} #{149}{}{Now, normally I don t mind selling information, but # you re not gonna get anything outta Lemmy about Mr. Decker.} #{150}{}{Ok, but can I ask you about some other things?} #{151}{}{Thanks.} {149}{}{ さてさて、普段は喜んで情報を売ってる俺だがな。Deckerさん のことをLemmyから聞き出そうったってそうはいかねーからな。} {150}{}{ そうか。他のことなら聞いてもいいか?} {151}{}{ どうも。} #{152}{}{Missing caravans, huh? Well, I might be knowin a bit # about those. It s gonna cost you 300 caps, though.} #{153}{}{Alright, what do you know?} #{154}{}{I ll give you 240.} #{155}{}{I think you need to tell me, right now, and without the freakin caps!} #{156}{}{Too rich for my blood.} {152}{}{ 行方不明のキャラバン、か。少しは分かるかなあ。300ドルかかる んだが。} {153}{}{ よし、話してくれ。} {154}{}{ 240なら出そう。} {155}{}{ 今すぐ話してもらおうか。ただし、そんな大金は出さん。} {156}{}{ 高過ぎだ。} #{157}{}{Well, I m not really that sure, but what I s heard # is that it ain t what everybody thinks. # Some new guy is getting into the action with some kind of # mutants or something. But don t quote # me on that.} #{158}{}{Figures. Is there anything I can quote you on, Lemmy?} #{159}{}{Can I ask you another question?} #{160}{}{Thanks.} {157}{}{ まあ、確実とは言い切れんのだが、俺が聞いてる話は皆が思っている こととはちょっと違う。見慣れない野郎がミュータントだか何だか分 からん連中と一緒に手を下してんだ。でも俺に聞いたなんてバラすな よ。} {158}{}{ 分かってる。Lemmy、あんたに聞いたことにしていい話なんて あるのか?} {159}{}{ 他に聞きたいことがある。} {160}{}{ ありがとう。} #{161}{}{Now, you might be insinuating that Lemmy ain t # a stand-up guy. Well, you s right. But Lemmy # is an ALIVE type of guy.} #{162}{}{Ok, forget about it. Can I ask you another question?} #{163}{}{Well, I m going to make you a lying down and not breathing type of guy!} #{164}{}{Forget about it. See ya .} {161}{}{ へっ、Lemmyはコソコソした野郎だなんて思ってんだろう。 あ あ、その通りだ。だがな、Lemmyは「生きててなんぼ」ってタイ プなんだよ。} {162}{}{ 分かった、忘れてくれ。違うことを聞いてもいいか。} {163}{}{ だったら「ぶっ倒れて息をしてません」ってタイプにしてやるよ。} {164}{}{ 忘れてくれ。じゃあな。} #{165}{}{Stuff for needs, huh? Well, I knows a guy over # in Old Town that can probably fix you up # with some stuff like that. But you know what? He needs # to know who you are before you show up # at his doorstep.} #{166}{}{Let me guess. This "invite" is going to "costs" me?} #{167}{}{I can see where this is going. I ll find him on my own.} {165}{}{ ほしいブツってか。そういうのを揃えられそうな奴は1人Old T ownにいる。だがなあ。見ず知らずの人間は入口を通してももらえ んぞ。} {166}{}{ それは要するに、「招待」してもらうには「金がいる」ってことだ な?} {167}{}{ 話は分かった。自力で探してみる。} #{168}{}{Exactly. So I m thinking... only for you of # course... 1000 caps so youse can talks to this guy # without him blowing your head off first.} #{169}{}{Alright, I ll pay your price.} #{170}{}{How about 800 caps instead?} #{171}{}{Because you like me so much Lemmy, why don t # you just do it for free? [As you flex your muscles]} #{172}{}{Can t afford that.} {168}{}{ その通り。ってことで・・・あんただけ特別に・・・1000ドルで いい。そうすりゃ、いきなり頭を吹っ飛ばされたりせずに話ができる ぜ。} {169}{}{ 分かった、その額払おう。} {170}{}{ 800ドルでどうだ。} {171}{}{ Lemmyは私のこと大好きだよなあ、だからタダでいいよなあ? [力こぶを作ってみせた]} {172}{}{ そんなに払えない。} #{173}{}{Well, what you gotta do is find your way over to Old Town. Over there is a guy # named Vance. Just talk to him. Like I said, I ll let him know you re coming.} #{174}{}{You re all heart. Can I ask you a few more things?} #{175}{}{Thanks.} {173}{}{ とりあえずOld Townまでは自分で行ってくれ。先方にはVa nceって奴がいるからそのまま話しかけろ。言ったとおり、あんた が行くことは知らせておく。} {174}{}{ いやー、心の広い人だ。もう少し質問してもいいかな。} {175}{}{ ありがとう。} #{176}{}{Sorry man, got things to do. Nice chattin with you, though.} {176}{}{ 悪いな、用事がある。話ができて楽しかったぞ。} #{177}{}{Well, you ve come back to talk to your old firend Lemmy, huh? What s it I can # help you with?} {177}{}{ ん、親愛なるLemmyに話があって来たってか?さてどんな用件か な。} #{178}{}{Well, you look like a businesswoman. # And I m a in business, so I thought we could, ah, discuss, ah, business.} {178}{}{ んー、なんか商用って感じなんだよな。俺もそうなんだ。なもんで、 あー、話でもできないかと、あー、仕事の話な。}
https://w.atwiki.jp/cupnes/pages/60.html
;====================================================================== ; 言語・文字コード関連の設定 ;====================================================================== (when (equal emacs-major-version 21) (require un-define)) (set-language-environment "Japanese") (set-terminal-coding-system utf-8) (set-keyboard-coding-system utf-8) (set-buffer-file-coding-system utf-8) (setq default-buffer-file-coding-system utf-8) (prefer-coding-system utf-8);;UTF-8優先 (set-default-coding-systems utf-8) (setq file-name-coding-system utf-8) ;======================================================================= ; Misc ;======================================================================= (mouse-wheel-mode);;ホイールマウス (global-font-lock-mode t);;文字の色つけ (setq line-number-mode t);;カーソルのある行番号を表示 (auto-compression-mode t);;日本語infoの文字化け防止 (set-scroll-bar-mode right);;スクロールバーを右に表示 (global-set-key "\C-h" backward-delete-char);;Ctrl-Hでバックスペース (setq visible-bell nil);;ヴィジュアルベル無効 (setq ring-bell-function (lambda ()));;ビープ音も無効 (when (boundp show-trailing-whitespace) (setq-default show-trailing-whitespace t));;行末のスペースを強調表示 ;; load-pathの設定 (add-to-list load-path (expand-file-name "~/site-lisp")) ;; 対応する括弧を強調表示 (show-paren-mode t) (setq show-paren-style mixed) ;(set-face-background show-paren-match-face "gray10") (set-face-background show-paren-match-face "lawn green") (set-face-foreground show-paren-match-face "light sea green") (set-face-background show-paren-mismatch-face "magenta") (set-face-foreground show-paren-mismatch-face "firebrick") ;; ツールバーを表示しない (tool-bar-mode 0) ;; メニューを消したい (menu-bar-mode -1) ;; 時計の設定 (setq display-time-string-forms ((substring year -2) "/" month "/" day " " dayname " " 24-hours " " minutes)) (display-time) ;; "Lisp nesting exceeds max-lisp-eval-depth"への対処 (setq max-lisp-eval-depth 1000) ;; "Variable binding depth exceeds max-specpdl-size"への対処 (setq max-specpdl-size 1867) ;; バッファの切換えをもっと楽にしたい − iswitchb ;; (iswitchb-default-keybindings) (iswitchb-mode 1) ;; 列数を表示する (column-number-mode t) ;; スタートアップ時のメッセージを抑制 (setq inhibit-startup-message t) ;; https //github.com/typester/emacs-config/blob/master/conf/init.el ;; % で対応する括弧に移動 (defun match-paren (arg) "Go to the matching paren if on a paren; otherwise insert %." (interactive "p") (cond ((looking-at "\\s\(") (forward-list 1) (backward-char 1)) ((looking-at "\\s\)") (forward-char 1) (backward-list 1)) (t (self-insert-command (or arg 1))))) (define-key global-map (kbd "C-5") match-paren) ;; C-t でother-window、分割されてなかったら分割 (defun other-window-or-split () ; http //d.hatena.ne.jp/rubikitch/20100210/emacs (interactive) (when (one-window-p) (split-window-horizontally)) (other-window 1)) (define-key global-map (kbd "C-t") other-window-or-split) ;; scratchの初期メッセージ消去 (setq initial-scratch-message "") ;; タイトルバーにファイルのフルパス表示 (setq frame-title-format (format "%%f - Emacs@%s" (system-name))) ;; 最近使ったファイルをメニューに表示 (recentf-mode t) ;; 最近使ったファイルの表示数 (setq recentf-max-menu-items 10) ;; 最近開いたファイルの保存数を増やす (setq recentf-max-saved-items 3000) ;; ミニバッファの履歴を保存する (savehist-mode 1) ;; ミニバッファの履歴の保存数を増やす (setq history-length 3000) ;; デフォルトのタブ幅を半角スペース4つ分に (setq default-tab-width 4) ;; c-modeの設定 (setq c-default-style "linux" c-basic-offset 4) ;; - http //d.hatena.ne.jp/syohex/20110624/1308871777 ;; c-modeの自動インデントをデフォルトで無効化 ;; 有効/無効はC-c C-lで切り替え ;; (add-hook c-mode-hook ;; (lambda () ;; (c-toggle-electric-state -1))) ;; auto-installの設定 (add-to-list load-path (expand-file-name "~/.emacs.d/auto-install")) (require auto-install) (auto-install-update-emacswiki-package-name t) (auto-install-compatibility-setup) (setq ediff-window-setup-function ediff-setup-windows-plain) ;; cmigemoの設定 ;; http //qiita.com/kenbeese/items/ebbf0128d7c752a94a22 (setq migemo-dictionary "/usr/local/share/migemo/utf-8/migemo-dict") (setq migemo-command "cmigemo") (setq migemo-options ("-q" "--emacs")) (setq migemo-user-dictionary nil) (setq migemo-coding-system utf-8) (setq migemo-regex-dictionary nil) (load-library "migemo") (migemo-init) ;; ;; anything.elの設定 ;; (require anything-startup) ;; auto-complete-mode.elの設定 (add-to-list load-path "~/.emacs.d/") (require auto-complete-config) (add-to-list ac-dictionary-directories "~/.emacs.d//ac-dict") (ac-config-default) ;; GNU GLOBAL(gtags.el)の設定(ここから) (add-to-list load-path "~/site-lisp") (autoload gtags-mode "gtags" "" t) (setq gtags-mode-hook (lambda () (local-set-key "\M-t" gtags-find-tag) (local-set-key "\M-r" gtags-find-rtag) (local-set-key "\M-s" gtags-find-symbol) (local-set-key "\C-t" gtags-pop-stack))) ;; (add-hook gtags-mode-hook ;; (lambda () ;; ; Local customization (overwrite key mapping) ;; (define-key gtags-mode-map "\C-f" scroll-up) ;; (define-key gtags-mode-map "\C-b" scroll-down) ;; )) (add-hook gtags-select-mode-hook (lambda () (setq hl-line-face underline) (hl-line-mode 1))) (add-hook c-mode-hook (lambda () (gtags-mode 1) (gtags-make-complete-list))) ; Customization (setq gtags-suggested-key-mapping t) (setq gtags-auto-update t) ;; GNU GLOBAL(gtags.el)の設定(ここまで) ;; Helmの設定 (add-to-list load-path "~/site-lisp/helm") (require helm-config)
https://w.atwiki.jp/opengl/pages/143.html
さて、前回の「再びキーフレーム」では箱が瞬間移動してしまって いました。 補間がされていないためです。 DirectX SDK 付属のビューワーでは滑らかにアニメーションが 補間されています。 今回はキーフレームとキーフレームの間を線形補間してみようと思います。 ベクトルAとベクトルB間の補間は、求める値をIとすると、 で求める事ができます。 ここでのtは現在のキー位置のパラメーターです。 尚、 0 ≦t≦ 1 で、tが0の時はAと同じ値、tが1の時はBと同じ値に なります。 前回と同じくsample2.xを表示しています。 font.h #pragma once class GLFONT { public HFONT Hfont; HDC Hdc; GLFONT(wchar_t *fontname, int size); void DrawStringW(int x,int y,wchar_t *format, ...); }; //コンストラクタ フォント作成 GLFONT GLFONT(wchar_t *fontname, int size) { Hfont = CreateFontW( size, //フォント高さ 0, //文字幅 0, //テキストの角度 0, //ベースラインとx軸との角度 FW_REGULAR, //フォントの太さ FALSE, //イタリック体 FALSE, //アンダーライン FALSE, //打ち消し線 SHIFTJIS_CHARSET, //文字セット OUT_DEFAULT_PRECIS, //出力精度 CLIP_DEFAULT_PRECIS, //クリッピング精度 ANTIALIASED_QUALITY, //出力品質 FIXED_PITCH | FF_MODERN, //ピッチとファミリー fontname); //書体名 Hdc = wglGetCurrentDC(); SelectObject(Hdc, Hfont); } //ワイド文字列の描画 void GLFONT DrawStringW(int x,int y,wchar_t *format, ...) { wchar_t buf[256]; va_list ap; int Length=0; int list=0; //ポインタがNULLの場合は終了 if ( format == NULL ) return; //文字列変換 va_start(ap, format); vswprintf_s(buf, format, ap); va_end(ap); Length = wcslen(buf); list = glGenLists(Length); for( int i=0; i wglUseFontBitmapsW(Hdc, buf[i], 1, list + (DWORD)i); } glDisable(GL_LIGHTING); glRasterPos2i(x, y); //ディスプレイリストで描画 for( int i=0; i { glCallList(list + i); } glEnable(GL_LIGHTING); //ディスプレイリスト破棄 glDeleteLists(list, Length); list = 0; Length = 0; } PNG.h #pragma once #include lodepng.h //テクスチャクラス class TEXTURE{ protected LodePNG_Decoder decoder;//デコーダ unsigned char* buffer;//バッファ size_t buffersize, imagesize;//サイズ public TEXTURE(); TEXTURE(const char* FileName);//コンストラクタ void LOAD_PNG(const char* FileName);//PNG読み込み unsigned char* image;//イメージポインタ unsigned int Width,Height;//画像サイズ }; TEXTURE TEXTURE(){ } TEXTURE TEXTURE(const char* FileName){ LOAD_PNG(FileName); } void TEXTURE LOAD_PNG(const char* FileName){ LodePNG_Decoder_init( decoder); //ロード LodePNG_loadFile( buffer, buffersize, FileName); //デコード LodePNG_decode( decoder, image, imagesize, buffer, buffersize); //幅,高さ Width = decoder.infoPng.width;Height = decoder.infoPng.height; } xfile.h #pragma once #include PNG.h using namespace std; //マトリクス構造体 struct MATRIX { union { struct { float _11, _12, _13, _14; float _21, _22, _23, _24; float _31, _32, _33, _34; float _41, _42, _43, _44; }; float mat_4x4[4][4]; float mat_16[16]; }; MATRIX(){//単位行列に初期化 for(int i=0;i 16;i++){ this- mat_16[i]=0; } this- _11=this- _22=this- _33=this- _44=1; } }; //3つのベクトル struct Vector3f{ float x; float y; float z; }vec3d; Vector3f operator*(Vector3f v,float size){ v.x *= size; v.y *= size; v.z *= size; return v; } Vector3f operator+(Vector3f a,Vector3f b){ a.x+=b.x; a.y+=b.y; a.z+=b.z; return a; } //4つのベクトル struct Vector4f{ float x; float y; float z; float w; }vec4d; //4つのカラー struct Color4{ float r; float g; float b; float a; }; //4つの反射 struct Reflection4{ Color4 diffuse; Color4 ambient; Color4 emission; Color4 specular; }; //UV座標 struct UV{ float u;//u値 float v;//v値 }vec2d; //ポリゴンデータ struct Triangle{ Vector3f TriVer; Vector3f TriNor; UV TriUV; }Tri; //ポリゴンデータ struct Quadrangle{ Vector3f QuadVer; Vector3f QuadNor; UV QuadUV; }Quad; //マテリアル構造体 struct MATERIAL{ string MaterialName;//マテリアル名 Reflection4 MaterialColor;//反射 float Shininess;//shininess string TextureName;//テクスチャ名 int TexNo;//テクスチャNO. vector Tridata;//三角面データ vector Quaddata;//四角面データ }mtl; //メッシュ構造体 struct MESH{ public vector Material;//マテリアル vector TexData;//テクスチャデータ vector TexID;//テクスチャID GLuint TexID2;//代入用 TEXTURE* tex;//代入用 }msh; //アニメーションデータ構造体 struct ANIMATION{ public vector Key;//アニメーションキー vector Matrix;//行列データ }anm; //ノード構造体 struct NODE{ NODE* Node;//子ノード NODE* Next;//隣の階層 string FrameName;//フレーム名 MESH* Mesh;//メッシュ ANIMATION Anim;//アニメーションデータ }nde; //階層メッシュクラス class HIERARCHY{ public void Draw();//描画 void Draw_Frame(NODE node,int Frame_Time);//フレーム描画 void Animation_Draw(int Animation_NO,int Frame);//アニメーション描画 HIERARCHY(); HIERARCHY(char* FileName,int size); NODE Root;//ルートノード int Size;//サイズ int Animation_MaxFrame;//最大フレーム private bool Load_Hierarchy(char* FileName); //階層メッシュ読み込み void Find_Frame(NODE node,char* name);//フレームを探す bool Load_Frame(FILE fp,NODE node,int hierarchy); //フレーム読み込み bool Load_Mesh(FILE fp,NODE node);//メッシュ読み込み bool Load_Animation(FILE fp);//アニメーション読み込み MATRIX Linear_Interpolation(MATRIX a,MATRIX b,float t);//線形補間 void Init(); char buffer[255]; int Back;//階層戻し NODE* pNode;//ノードポインタ }; //コンストラクタ HIERARCHY HIERARCHY(){ Init(); } //コンストラクタ HIERARCHY HIERARCHY(char* FileName,int size){ Init(); Size=size; Load_Hierarchy(FileName); } //初期化 void HIERARCHY Init(){ Root.Node=NULL; Root.Next=NULL; Root.FrameName= Root ; Root.Mesh=NULL; } //線形補間 MATRIX HIERARCHY Linear_Interpolation(MATRIX a,MATRIX b,float t){ MATRIX ret; Vector3f vec_A, vec_B; vec_A.x=a._41; vec_A.y=a._42; vec_A.z=a._43; vec_B.x=b._41; vec_B.y=b._42; vec_B.z=b._43; Vector3f vec_R=vec_A*(1.0f-t) + vec_B*t; ret._41=vec_R.x; ret._42=vec_R.y; ret._43=vec_R.z; return ret; } //フレーム描画 void HIERARCHY Draw_Frame(NODE node,int Frame_Time){ while(1){ if(node.Mesh!=NULL){ glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_NORMAL_ARRAY); for(int i=0;i (signed)node.Mesh- Material.size();i++){ glPushMatrix(); glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,(const GLfloat *) node.Mesh- Material[i].MaterialColor.ambient); glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,(const GLfloat *) node.Mesh- Material[i].MaterialColor.diffuse); glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,(const GLfloat *) node.Mesh- Material[i].MaterialColor.specular); glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,node.Mesh- Material[i].Shininess); if(node.Mesh- Material[i].TexNo 0){ glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, node.Mesh- TexID[node.Mesh- Material[i].TexNo-1]); }else{ glDisable(GL_TEXTURE_2D); glDisableClientState(GL_TEXTURE_COORD_ARRAY); } //線形補間 for(int k=1;k (signed)node.Anim.Key.size();k++){ int Length=node.Anim.Key[k]-node.Anim.Key[k-1];//キー間の長さ int Current=Frame_Time-node.Anim.Key[k-1];//キー間の現在位置 float t=(float)Current/(float)Length; if((node.Anim.Key[k-1] =Frame_Time) (node.Anim.Key[k] Frame_Time)){ MATRIX Linear = Linear_Interpolation(node.Anim.Matrix[k-1],node.Anim.Matrix[k],t); glMultMatrixf( Linear.mat_16[0]); } } if(node.Mesh- Material[i].Tridata.size() 1){ glVertexPointer(3, GL_FLOAT,sizeof(Tri) , node.Mesh- Material[i].Tridata[0].TriVer.x); glNormalPointer(GL_FLOAT,sizeof(Tri), node.Mesh- Material[i].Tridata[0].TriNor.x); //if(node.Mesh- Material[i].TexNo 0)glTexCoordPointer(2, GL_FLOAT, sizeof(Tri), node.Mesh- Material[i].Tridata[0].TriUV.u); glDrawArrays(GL_TRIANGLES,0,node.Mesh- Material[i].Tridata.size()); } if(node.Mesh- Material[i].Quaddata.size() 1){ glVertexPointer(3, GL_FLOAT,sizeof(Quad) , node.Mesh- Material[i].Quaddata[0].QuadVer.x); glNormalPointer(GL_FLOAT,sizeof(Quad), node.Mesh- Material[i].Quaddata[0].QuadNor.x); //if(node.Mesh- Material[i].TexNo 0)glTexCoordPointer(2, GL_FLOAT, sizeof(Quad), node.Mesh- Material[i].Quaddata[0].QuadUV.u); glDrawArrays(GL_QUADS,0,node.Mesh- Material[i].Quaddata.size()); } glPopMatrix(); } glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_NORMAL_ARRAY); //glDisableClientState(GL_TEXTURE_COORD_ARRAY); //glDisable(GL_TEXTURE_2D); } if(node.Node!=NULL)Draw_Frame(*node.Node,Frame_Time); if(node.Next!=NULL)Draw_Frame(*node.Next,Frame_Time); if(node.Node==NULL)return; if(node.Next==NULL)return; return; } } //アニメーション描画 void HIERARCHY Animation_Draw(int Animation_NO,int Frame){ Draw_Frame(Root,Frame); } //描画 void HIERARCHY Draw(){ Draw_Frame(Root,0); } //フレームを探す void HIERARCHY Find_Frame(NODE node,char* name){ while(1){ if(strcmp(node.FrameName.c_str(),name)==0){ pNode= node; return; } if(node.Node!=NULL)Find_Frame(*node.Node,name); if(node.Next!=NULL)Find_Frame(*node.Next,name); if(node.Node==NULL)return; if(node.Next==NULL)return; return; } return; } //アニメーション読み込み bool HIERARCHY Load_Animation(FILE fp){ char buf[255]; char name[255]; vector Quaternion; vector Transform; vector Scaling; vector Key1; vector Key2; vector Key3; int hierarchy=0,count=0,keyID,key=0,dummy=0,x=0,y=0,z=0,w=0; //平行移動用 MATRIX move; //読み込み while(!feof( fp)) { ZeroMemory(buf,sizeof(buf)); fscanf_s( fp, %s ,buf,sizeof(buf)); //AnimationSetを探す if(strcmp(buf, AnimationSet )==0){ while(!feof( fp)) { fgets(buf,sizeof(buf), fp); if(strstr(buf, AnimationKey )==NULL){ if((!strstr(buf, { )==NULL) (!strstr(buf, } )==NULL)){//名前の抽出 sscanf_s(buf, { %s } , name,sizeof(name)); pNode=NULL; Find_Frame(Root,name); pNode- Anim.Matrix.resize(Key3.size()); for(int i=0;i (signed)Key3.size();i++){ move._41=Transform[i].x*Size; move._42=Transform[i].y*Size; move._43=Transform[i].z*Size; pNode- Anim.Key.push_back(Key3[i]); for(int j=0;j 16;j++)pNode- Anim.Matrix[i].mat_16[j]=move.mat_16[j]; } Animation_MaxFrame=Key3[Key3.size()-1]; Quaternion.clear(); Scaling.clear(); Transform.clear(); Key1.clear(); Key2.clear(); Key3.clear(); } }else{ fgets(buf,sizeof(buf), fp);//キー 0 回転 , 1 拡大縮小 , 2 平行移動 keyID=atoi(buf); fgets(buf,sizeof(buf), fp);//キーデータの個数 count=atoi(buf); switch (keyID){ case 0 for(int i=0;i fscanf_s( fp, %d;%d;%f,%f,%f,%f;;, , key, dummy, vec4d.w, vec4d.x, vec4d.y, vec4d.z); Key1.push_back(key); Quaternion.push_back(vec4d); } break; case 1 for(int i=0;i fscanf_s( fp, %d;%d;%f,%f,%f;;, , key, dummy, vec3d.x, vec3d.y, vec3d.z); Key2.push_back(key); Scaling.push_back(vec3d); } break; case 2 for(int i=0;i fscanf_s( fp, %d;%d;%f,%f,%f;;, , key, dummy, vec3d.x, vec3d.y, vec3d.z); Key3.push_back(key); Transform.push_back(vec3d); } break; default break; } } } } } Animation_MaxFrame=pNode- Anim.Key[pNode- Anim.Key.size()-1]; Quaternion.clear(); Scaling.clear(); Transform.clear(); Key1.clear(); Key2.clear(); Key3.clear(); return true; } //メッシュ読み込み bool HIERARCHY Load_Mesh(FILE fp,NODE node){ vector Vertex;//頂点 vector Normal;//法線 vector uv;//UV vector VertexIndex; vector NormalIndex; vector MaterialIndex; vector FaceIndex; char key[255]; char buf[255]; int v1=0,v2=0,v3=0,v4=0; int Count=0; string str= ; //読み込み while(!feof( fp)) { //キーワード 読み込み ZeroMemory(key,sizeof(key)); fscanf_s( fp, %s ,key,sizeof(key)); //頂点 読み込み if(strcmp(key, Mesh )==0) { fgets(buf,sizeof(buf), fp);//データは2行下にあると推定 改行する fgets(buf,sizeof(buf), fp); Count=atoi(buf); for(int i=0;i { fscanf_s( fp, %f;%f;%f;, , vec3d.x, vec3d.y, vec3d.z); Vertex.push_back(vec3d*(float)Size); } //頂点インデックス読み込み fgets(buf,sizeof(buf), fp);//データは2行下にあると推定 改行する fgets(buf,sizeof(buf), fp); while(strchr(buf, ; )==NULL){fgets(buf,sizeof(buf), fp);}//空行対策 Count=atoi(buf); for(int i=0;i { int dammy=0; fgets(buf,sizeof(buf), fp); str=buf; string size_type first = str.find_first_not_of( ); string size_type index = str.find( 3; ); if(index-first==0){ sscanf_s(buf, %d;%d,%d,%d;, , dammy, v1, v2, v3); VertexIndex.push_back(v1); VertexIndex.push_back(v2); VertexIndex.push_back(v3); } if((index==-1)||(index-first 1)){ sscanf_s(buf, %d;%d,%d,%d,%d;, , dammy, v1, v2, v3, v4); VertexIndex.push_back(v1); VertexIndex.push_back(v2); VertexIndex.push_back(v3); VertexIndex.push_back(v4); } FaceIndex.push_back(dammy); } } //法線 読み込み if(strcmp(key, MeshNormals )==0) { fgets(buf,sizeof(buf), fp);//データは2行下にあると推定 改行する fgets(buf,sizeof(buf), fp); Count=atoi(buf); for(int i=0;i { fscanf_s( fp, %f;%f;%f;, , vec3d.x, vec3d.y, vec3d.z); Normal.push_back(vec3d); } //法線インデックス読み込み fgets(buf,sizeof(buf), fp);//データは2行下にあると推定 改行する fgets(buf,sizeof(buf), fp); while(strchr(buf, ; )==NULL){fgets(buf,sizeof(buf), fp);}//空行対策 Count=atoi(buf); for(int i=0;i { int dammy=0; fgets(buf,sizeof(buf), fp); str=buf; string size_type first = str.find_first_not_of( ); string size_type index = str.find( 3; ); if(index-first==0){ sscanf_s(buf, %d;%d,%d,%d;, , dammy, v1, v2, v3); NormalIndex.push_back(v1); NormalIndex.push_back(v2); NormalIndex.push_back(v3); } if((index==-1)||(index-first 1)){ sscanf_s(buf, %d;%d,%d,%d,%d;, , dammy, v1, v2, v3, v4); NormalIndex.push_back(v1); NormalIndex.push_back(v2); NormalIndex.push_back(v3); NormalIndex.push_back(v4); } } } //マテリアルリスト if(strcmp(key, MeshMaterialList )==0) { fgets(buf,sizeof(buf), fp);//空改行 fgets(buf,sizeof(buf), fp);//マテリアル数 fgets(buf,sizeof(buf), fp);//リスト要素数 Count=atoi(buf); for(int i=0;i { fgets(buf,sizeof(buf), fp); int test=atoi(buf); MaterialIndex.push_back(test); } } //マテリアル読み込み if(strcmp(key, Material )==0) { fgets(buf,sizeof(buf), fp);//直後の行にあると推定 改行する //ディフューズ fscanf_s( fp, %f;%f;%f;%f;; , vec4d.x, vec4d.y, vec4d.z, vec4d.w); mtl.MaterialColor.diffuse=(const Color4 )vec4d; //SHININESS fscanf_s( fp, %f; , mtl.Shininess); //スペキュラー fscanf_s( fp, %f;%f;%f;; , vec4d.x, vec4d.y, vec4d.z); mtl.MaterialColor.specular=(const Color4 )vec4d; //エミッシブ fscanf_s( fp, %f;%f;%f;; , vec4d.x, vec4d.y, vec4d.z); mtl.MaterialColor.ambient=(const Color4 )vec4d; node.Mesh =new MESH(msh); node.Mesh- Material.push_back(mtl); Count=0; //マテリアル毎のデータを作成 for(int i=0;i (signed)MaterialIndex.size();i++){ if(FaceIndex[i]==3){ for(int j=0;j 3;j++){ Tri.TriVer=Vertex[VertexIndex[Count+j]]; Tri.TriNor=Normal[NormalIndex[Count+j]]; //Tri.TriUV=uv[VertexIndex[Count+j]]; node.Mesh- Material[MaterialIndex[i]].Tridata.push_back(Tri); } Count+=3; }else{ for(int j=0;j 4;j++){ Quad.QuadVer=Vertex[VertexIndex[Count+j]]; Quad.QuadNor=Normal[NormalIndex[Count+j]]; //Quad.QuadUV=uv[VertexIndex[Count+j]]; node.Mesh- Material[MaterialIndex[i]].Quaddata.push_back(Quad); } Count+=4; } } Vertex.clear(); Normal.clear(); uv.clear(); VertexIndex.clear(); NormalIndex.clear(); MaterialIndex.clear(); FaceIndex.clear(); return true; } } return false; } //フレーム読み込み bool HIERARCHY Load_Frame(FILE fp,NODE node,int hierarchy){ char key[255]; int begin=0,end=0; int current=hierarchy;//現在の階層 int file_pos; while(!feof( fp)) { //キーワード 読み込み ZeroMemory(key,sizeof(key)); fscanf_s( fp, %s ,key,sizeof(key)); //ヘッダー読み飛ばし if(strcmp(key, Header )==0){ while(strcmp(key, } )){ fscanf_s( fp, %s ,key,sizeof(key)); } continue; } //テンプレート読み飛ばし if(strcmp(key, template )==0){ while(strcmp(key, } )){ fscanf_s( fp, %s ,key,sizeof(key)); } continue; } //階層+ if(strcmp(key, { )==0){ begin++; } //階層- if(strcmp(key, } )==0){ end++; } //フレーム if(strcmp(key, Frame )==0){ fscanf_s( fp, %s ,key,sizeof(key)); if(((begin==0) (end==0))||(end-begin==-1)){//子ノード追加 node.Node=new NODE(nde); node.Node- FrameName=key; file_pos=ftell( fp); Load_Mesh(fp,*node.Node); fseek( fp, file_pos, SEEK_SET ); hierarchy++; Load_Frame(fp,*node.Node,hierarchy);//再帰呼び出し } if(Back==current){//階層戻り先にきた場合、同一階層追加 Back=-1; node.Next=new NODE(nde); node.Next- FrameName=buffer; file_pos=ftell( fp); Load_Mesh(fp,*node.Next); fseek( fp, file_pos, SEEK_SET ); Load_Frame(fp,*node.Next,current);//再帰呼び出し } if(end-begin 0){// } が { より多い時は階層を戻る strcpy_s(buffer,255,key); Back=current-(end-begin); return true; } if((end-begin==0) ((begin!=0) (end!=0))){//同一階層追加 node.Next=new NODE(nde); node.Next- FrameName=key; file_pos=ftell( fp); Load_Mesh(fp,*node.Next); fseek( fp, file_pos, SEEK_SET ); Load_Frame(fp,*node.Next,current);//再帰呼び出し } //階層を戻る if((Back!=-1) (Back } } return true; } //階層メッシュ読み込み bool HIERARCHY Load_Hierarchy(char* FileName){ //Xファイルを開いて内容を読み込む Back=-1; int Hierarchy=0; FILE* fp=NULL; fopen_s( fp,FileName, rt ); //読み込み fseek(fp,0,SEEK_SET); Load_Frame(*fp,Root,Hierarchy); fseek(fp,0,SEEK_SET); Load_Animation(*fp); fclose(fp); return true; } main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #include xfile.h #include font.h #define WIDTH 320 #define HEIGHT 240 float angle=0.0f; HIERARCHY* hierarchy; GLFONT *font; wstring wstr; wchar_t wchar[255]; int CurrentFrame; void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glViewport(0,0,WIDTH,HEIGHT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(30.0, WIDTH/HEIGHT, 0.1, 2000.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0.0, 1000.0, 1000.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); //階層アニメーション hierarchy- Animation_Draw(0,CurrentFrame); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glOrtho(0, WIDTH, HEIGHT, 0, -1, 1); glColor4f(1.0f, 1.0f, 1.0f, 1.0f); wstr=L 最大フレーム[ ; _itow_s(hierarchy- Animation_MaxFrame,wchar,255,10); wstr+=wchar; wstr+=L ] ; font- DrawStringW(0,16,(wchar_t *)wstr.c_str()); wstr=L 現在のフレーム[ ; _itow_s(CurrentFrame,wchar,255,10); wstr+=wchar; wstr+=L ] ; font- DrawStringW(0,32,(wchar_t *)wstr.c_str()); glutSwapBuffers(); } void idle(void) { if(hierarchy- Animation_MaxFrame CurrentFrame)CurrentFrame=0; Sleep(1); glutPostRedisplay(); } //タイマー void timer(int value) { CurrentFrame+=30; glutTimerFunc(10 , timer , 0); } void Init(){ glClearColor(0.0, 0.0, 0.0, 1.0); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHT0); glEnable(GL_LIGHTING); glEnable(GL_CULL_FACE); glCullFace(GL_BACK); hierarchy = new HIERARCHY( sample2.x ,100); font = new GLFONT(L MS明朝 , 16); } int main(int argc, char *argv[]) { glutInitWindowPosition(100, 100); glutInitWindowSize(WIDTH, HEIGHT); glutInit( argc, argv); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); glutCreateWindow( 線形補間 ); glutDisplayFunc(display); glutIdleFunc(idle); glutTimerFunc(10 , timer , 0); Init(); glutMainLoop(); return 0; }
https://w.atwiki.jp/opengl/pages/147.html
平行移動と同じようにして拡大縮小も線形補間してみました。 新規に作成した sample3.x を表示しています。 font.h #pragma once class GLFONT { public HFONT Hfont; HDC Hdc; GLFONT(wchar_t *fontname, int size); void DrawStringW(int x,int y,wchar_t *format, ...); }; //コンストラクタ フォント作成 GLFONT GLFONT(wchar_t *fontname, int size) { Hfont = CreateFontW( size, //フォント高さ 0, //文字幅 0, //テキストの角度 0, //ベースラインとx軸との角度 FW_REGULAR, //フォントの太さ FALSE, //イタリック体 FALSE, //アンダーライン FALSE, //打ち消し線 SHIFTJIS_CHARSET, //文字セット OUT_DEFAULT_PRECIS, //出力精度 CLIP_DEFAULT_PRECIS, //クリッピング精度 ANTIALIASED_QUALITY, //出力品質 FIXED_PITCH | FF_MODERN, //ピッチとファミリー fontname); //書体名 Hdc = wglGetCurrentDC(); SelectObject(Hdc, Hfont); } //ワイド文字列の描画 void GLFONT DrawStringW(int x,int y,wchar_t *format, ...) { wchar_t buf[256]; va_list ap; int Length=0; int list=0; //ポインタがNULLの場合は終了 if ( format == NULL ) return; //文字列変換 va_start(ap, format); vswprintf_s(buf, format, ap); va_end(ap); Length = wcslen(buf); list = glGenLists(Length); for( int i=0; i wglUseFontBitmapsW(Hdc, buf[i], 1, list + (DWORD)i); } glDisable(GL_LIGHTING); glRasterPos2i(x, y); //ディスプレイリストで描画 for( int i=0; i { glCallList(list + i); } glEnable(GL_LIGHTING); //ディスプレイリスト破棄 glDeleteLists(list, Length); list = 0; Length = 0; } PNG.h #pragma once #include lodepng.h //テクスチャクラス class TEXTURE{ protected LodePNG_Decoder decoder;//デコーダ unsigned char* buffer;//バッファ size_t buffersize, imagesize;//サイズ public TEXTURE(); TEXTURE(const char* FileName);//コンストラクタ void LOAD_PNG(const char* FileName);//PNG読み込み unsigned char* image;//イメージポインタ unsigned int Width,Height;//画像サイズ }; TEXTURE TEXTURE(){ } TEXTURE TEXTURE(const char* FileName){ LOAD_PNG(FileName); } void TEXTURE LOAD_PNG(const char* FileName){ LodePNG_Decoder_init( decoder); //ロード LodePNG_loadFile( buffer, buffersize, FileName); //デコード LodePNG_decode( decoder, image, imagesize, buffer, buffersize); //幅,高さ Width = decoder.infoPng.width;Height = decoder.infoPng.height; } xfile.h #pragma once #include PNG.h using namespace std; //マトリクス構造体 struct MATRIX { union { struct { float _11, _12, _13, _14; float _21, _22, _23, _24; float _31, _32, _33, _34; float _41, _42, _43, _44; }; float mat_4x4[4][4]; float mat_16[16]; }; MATRIX(){//単位行列に初期化 for(int i=0;i 16;i++){ this- mat_16[i]=0; } this- _11=this- _22=this- _33=this- _44=1; } }; //3つのベクトル struct Vector3f{ float x; float y; float z; }vec3d; Vector3f operator*(Vector3f v,float size){ v.x *= size; v.y *= size; v.z *= size; return v; } Vector3f operator+(Vector3f a,Vector3f b){ a.x+=b.x; a.y+=b.y; a.z+=b.z; return a; } //4つのベクトル struct Vector4f{ float x; float y; float z; float w; }vec4d; //4つのカラー struct Color4{ float r; float g; float b; float a; }; //4つの反射 struct Reflection4{ Color4 diffuse; Color4 ambient; Color4 emission; Color4 specular; }; //UV座標 struct UV{ float u;//u値 float v;//v値 }vec2d; //ポリゴンデータ struct Triangle{ Vector3f TriVer; Vector3f TriNor; UV TriUV; }Tri; //ポリゴンデータ struct Quadrangle{ Vector3f QuadVer; Vector3f QuadNor; UV QuadUV; }Quad; //マテリアル構造体 struct MATERIAL{ string MaterialName;//マテリアル名 Reflection4 MaterialColor;//反射 float Shininess;//shininess string TextureName;//テクスチャ名 int TexNo;//テクスチャNO. vector Tridata;//三角面データ vector Quaddata;//四角面データ }mtl; //メッシュ構造体 struct MESH{ public vector Material;//マテリアル vector TexData;//テクスチャデータ vector TexID;//テクスチャID GLuint TexID2;//代入用 TEXTURE* tex;//代入用 }msh; //アニメーションデータ構造体 struct ANIMATION{ public vector Key;//アニメーションキー vector Matrix;//行列データ }anm; //ノード構造体 struct NODE{ NODE* Node;//子ノード NODE* Next;//隣の階層 string FrameName;//フレーム名 MESH* Mesh;//メッシュ ANIMATION Anim;//アニメーションデータ }nde; //階層メッシュクラス class HIERARCHY{ public void Draw();//描画 void Draw_Frame(NODE node,int Frame_Time);//フレーム描画 void Animation_Draw(int Animation_NO,int Frame);//アニメーション描画 HIERARCHY(); HIERARCHY(char* FileName,int size); NODE Root;//ルートノード int Size;//サイズ int Animation_MaxFrame;//最大フレーム private bool Load_Hierarchy(char* FileName); //階層メッシュ読み込み void Find_Frame(NODE node,char* name);//フレームを探す bool Load_Frame(FILE fp,NODE node,int hierarchy); //フレーム読み込み bool Load_Mesh(FILE fp,NODE node);//メッシュ読み込み bool Load_Animation(FILE fp);//アニメーション読み込み MATRIX Linear_Interpolation(MATRIX a,MATRIX b,float t);//線形補間 void Init(); char buffer[255]; int Back;//階層戻し NODE* pNode;//ノードポインタ }; //コンストラクタ HIERARCHY HIERARCHY(){ Init(); } //コンストラクタ HIERARCHY HIERARCHY(char* FileName,int size){ Init(); Size=size; Load_Hierarchy(FileName); } //初期化 void HIERARCHY Init(){ Root.Node=NULL; Root.Next=NULL; Root.FrameName= Root ; Root.Mesh=NULL; } //線形補間 MATRIX HIERARCHY Linear_Interpolation(MATRIX a,MATRIX b,float t){ MATRIX ret; Vector3f vec_A, vec_B, vec_R; //平行移動 vec_A.x=a._41; vec_A.y=a._42; vec_A.z=a._43; vec_B.x=b._41; vec_B.y=b._42; vec_B.z=b._43; vec_R=vec_A*(1.0f-t) + vec_B*t; ret._41=vec_R.x; ret._42=vec_R.y; ret._43=vec_R.z; //スケーリング vec_A.x=a._11; vec_A.y=a._22; vec_A.z=a._33; vec_B.x=b._11; vec_B.y=b._22; vec_B.z=b._33; vec_R=vec_A*(1.0f-t) + vec_B*t; ret._11=vec_R.x; ret._22=vec_R.y; ret._33=vec_R.z; return ret; } //フレーム描画 void HIERARCHY Draw_Frame(NODE node,int Frame_Time){ while(1){ if(node.Mesh!=NULL){ glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_NORMAL_ARRAY); for(int i=0;i (signed)node.Mesh- Material.size();i++){ glPushMatrix(); glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,(const GLfloat *) node.Mesh- Material[i].MaterialColor.ambient); glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,(const GLfloat *) node.Mesh- Material[i].MaterialColor.diffuse); glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,(const GLfloat *) node.Mesh- Material[i].MaterialColor.specular); glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,node.Mesh- Material[i].Shininess); if(node.Mesh- Material[i].TexNo 0){ glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, node.Mesh- TexID[node.Mesh- Material[i].TexNo-1]); }else{ glDisable(GL_TEXTURE_2D); glDisableClientState(GL_TEXTURE_COORD_ARRAY); } //線形補間 for(int k=1;k (signed)node.Anim.Key.size();k++){ int Length=node.Anim.Key[k]-node.Anim.Key[k-1];//キー間の長さ int Current=Frame_Time-node.Anim.Key[k-1];//キー間の現在位置 float t=(float)Current/(float)Length; if((node.Anim.Key[k-1] =Frame_Time) (node.Anim.Key[k] Frame_Time)){ MATRIX Linear = Linear_Interpolation(node.Anim.Matrix[k-1],node.Anim.Matrix[k],t); glMultMatrixf( Linear.mat_16[0]); } } if(node.Mesh- Material[i].Tridata.size() 1){ glVertexPointer(3, GL_FLOAT,sizeof(Tri) , node.Mesh- Material[i].Tridata[0].TriVer.x); glNormalPointer(GL_FLOAT,sizeof(Tri), node.Mesh- Material[i].Tridata[0].TriNor.x); //if(node.Mesh- Material[i].TexNo 0)glTexCoordPointer(2, GL_FLOAT, sizeof(Tri), node.Mesh- Material[i].Tridata[0].TriUV.u); glDrawArrays(GL_TRIANGLES,0,node.Mesh- Material[i].Tridata.size()); } if(node.Mesh- Material[i].Quaddata.size() 1){ glVertexPointer(3, GL_FLOAT,sizeof(Quad) , node.Mesh- Material[i].Quaddata[0].QuadVer.x); glNormalPointer(GL_FLOAT,sizeof(Quad), node.Mesh- Material[i].Quaddata[0].QuadNor.x); //if(node.Mesh- Material[i].TexNo 0)glTexCoordPointer(2, GL_FLOAT, sizeof(Quad), node.Mesh- Material[i].Quaddata[0].QuadUV.u); glDrawArrays(GL_QUADS,0,node.Mesh- Material[i].Quaddata.size()); } glPopMatrix(); } glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_NORMAL_ARRAY); //glDisableClientState(GL_TEXTURE_COORD_ARRAY); //glDisable(GL_TEXTURE_2D); } if(node.Node!=NULL)Draw_Frame(*node.Node,Frame_Time); if(node.Next!=NULL)Draw_Frame(*node.Next,Frame_Time); if(node.Node==NULL)return; if(node.Next==NULL)return; return; } } //アニメーション描画 void HIERARCHY Animation_Draw(int Animation_NO,int Frame){ Draw_Frame(Root,Frame); } //描画 void HIERARCHY Draw(){ Draw_Frame(Root,0); } //フレームを探す void HIERARCHY Find_Frame(NODE node,char* name){ while(1){ if(strcmp(node.FrameName.c_str(),name)==0){ pNode= node; return; } if(node.Node!=NULL)Find_Frame(*node.Node,name); if(node.Next!=NULL)Find_Frame(*node.Next,name); if(node.Node==NULL)return; if(node.Next==NULL)return; return; } return; } //アニメーション読み込み bool HIERARCHY Load_Animation(FILE fp){ char buf[255]; char name[255]; vector Quaternion; vector Transform; vector Scaling; vector Key1; vector Key2; vector Key3; int hierarchy=0,count=0,keyID,key=0,dummy=0,x=0,y=0,z=0,w=0; //合成行列 MATRIX mix; //読み込み while(!feof( fp)) { ZeroMemory(buf,sizeof(buf)); fscanf_s( fp, %s ,buf,sizeof(buf)); //AnimationSetを探す if(strcmp(buf, AnimationSet )==0){ while(!feof( fp)) { fgets(buf,sizeof(buf), fp); if(strstr(buf, AnimationKey )==NULL){ if((!strstr(buf, { )==NULL) (!strstr(buf, } )==NULL)){//名前の抽出 sscanf_s(buf, { %s } , name,sizeof(name)); pNode=NULL; Find_Frame(Root,name); pNode- Anim.Matrix.resize(Key3.size()); for(int i=0;i (signed)Key3.size();i++){ if(Key2.size()==Key3.size()){ mix._11=Scaling[i].x; mix._22=Scaling[i].y; mix._33=Scaling[i].z; } mix._41=Transform[i].x*Size; mix._42=Transform[i].y*Size; mix._43=Transform[i].z*Size; pNode- Anim.Key.push_back(Key3[i]); for(int j=0;j 16;j++)pNode- Anim.Matrix[i].mat_16[j]=mix.mat_16[j]; } Animation_MaxFrame=Key3[Key3.size()-1]; Quaternion.clear(); Scaling.clear(); Transform.clear(); Key1.clear(); Key2.clear(); Key3.clear(); } }else{ fgets(buf,sizeof(buf), fp);//キー 0 回転 , 1 拡大縮小 , 2 平行移動 keyID=atoi(buf); fgets(buf,sizeof(buf), fp);//キーデータの個数 count=atoi(buf); switch (keyID){ case 0 for(int i=0;i fscanf_s( fp, %d;%d;%f,%f,%f,%f;;, , key, dummy, vec4d.w, vec4d.x, vec4d.y, vec4d.z); Key1.push_back(key); Quaternion.push_back(vec4d); } break; case 1 for(int i=0;i fscanf_s( fp, %d;%d;%f,%f,%f;;, , key, dummy, vec3d.x, vec3d.y, vec3d.z); Key2.push_back(key); Scaling.push_back(vec3d); } break; case 2 for(int i=0;i fscanf_s( fp, %d;%d;%f,%f,%f;;, , key, dummy, vec3d.x, vec3d.y, vec3d.z); Key3.push_back(key); Transform.push_back(vec3d); } break; default break; } } } } } Animation_MaxFrame=pNode- Anim.Key[pNode- Anim.Key.size()-1]; Quaternion.clear(); Scaling.clear(); Transform.clear(); Key1.clear(); Key2.clear(); Key3.clear(); return true; } //メッシュ読み込み bool HIERARCHY Load_Mesh(FILE fp,NODE node){ vector Vertex;//頂点 vector Normal;//法線 vector uv;//UV vector VertexIndex; vector NormalIndex; vector MaterialIndex; vector FaceIndex; char key[255]; char buf[255]; int v1=0,v2=0,v3=0,v4=0; int Count=0,Hierarchy=1; string str= ; fscanf_s( fp, %s ,key,sizeof(key)); node.Mesh =new MESH(msh); //読み込み while(!feof( fp)) { //キーワード 読み込み ZeroMemory(key,sizeof(key)); fscanf_s( fp, %s ,key,sizeof(key)); //階層+ if(strcmp(key, { )==0){ Hierarchy++; } //階層- if(strcmp(key, } )==0){ Hierarchy--; if(Hierarchy==0){ Count=0; //マテリアル毎のデータを作成 for(int i=0;i (signed)MaterialIndex.size();i++){ if(FaceIndex[i]==3){ for(int j=0;j 3;j++){ Tri.TriVer=Vertex[VertexIndex[Count+j]]; Tri.TriNor=Normal[NormalIndex[Count+j]]; //Tri.TriUV=uv[VertexIndex[Count+j]]; node.Mesh- Material[MaterialIndex[i]].Tridata.push_back(Tri); } Count+=3; }else{ for(int j=0;j 4;j++){ Quad.QuadVer=Vertex[VertexIndex[Count+j]]; Quad.QuadNor=Normal[NormalIndex[Count+j]]; //Quad.QuadUV=uv[VertexIndex[Count+j]]; node.Mesh- Material[MaterialIndex[i]].Quaddata.push_back(Quad); } Count+=4; } } Vertex.clear(); Normal.clear(); uv.clear(); VertexIndex.clear(); NormalIndex.clear(); MaterialIndex.clear(); FaceIndex.clear(); return true; } } //頂点 読み込み if(strcmp(key, Mesh )==0) { Hierarchy++; fgets(buf,sizeof(buf), fp);//データは2行下にあると推定 改行する fgets(buf,sizeof(buf), fp); Count=atoi(buf); for(int i=0;i { fscanf_s( fp, %f;%f;%f;, , vec3d.x, vec3d.y, vec3d.z); Vertex.push_back(vec3d*(float)Size); } //頂点インデックス読み込み fgets(buf,sizeof(buf), fp);//データは2行下にあると推定 改行する fgets(buf,sizeof(buf), fp); while(strchr(buf, ; )==NULL){fgets(buf,sizeof(buf), fp);}//空行対策 Count=atoi(buf); for(int i=0;i { int dammy=0; fgets(buf,sizeof(buf), fp); str=buf; string size_type first = str.find_first_not_of( ); string size_type index = str.find( 3; ); if(index-first==0){ sscanf_s(buf, %d;%d,%d,%d;, , dammy, v1, v2, v3); VertexIndex.push_back(v1); VertexIndex.push_back(v2); VertexIndex.push_back(v3); } if((index==-1)||(index-first 1)){ sscanf_s(buf, %d;%d,%d,%d,%d;, , dammy, v1, v2, v3, v4); VertexIndex.push_back(v1); VertexIndex.push_back(v2); VertexIndex.push_back(v3); VertexIndex.push_back(v4); } FaceIndex.push_back(dammy); } } //法線 読み込み if(strcmp(key, MeshNormals )==0) { Hierarchy++; fgets(buf,sizeof(buf), fp);//データは2行下にあると推定 改行する fgets(buf,sizeof(buf), fp); Count=atoi(buf); for(int i=0;i { fscanf_s( fp, %f;%f;%f;, , vec3d.x, vec3d.y, vec3d.z); Normal.push_back(vec3d); } //法線インデックス読み込み fgets(buf,sizeof(buf), fp);//データは2行下にあると推定 改行する fgets(buf,sizeof(buf), fp); while(strchr(buf, ; )==NULL){fgets(buf,sizeof(buf), fp);}//空行対策 Count=atoi(buf); for(int i=0;i { int dammy=0; fgets(buf,sizeof(buf), fp); str=buf; string size_type first = str.find_first_not_of( ); string size_type index = str.find( 3; ); if(index-first==0){ sscanf_s(buf, %d;%d,%d,%d;, , dammy, v1, v2, v3); NormalIndex.push_back(v1); NormalIndex.push_back(v2); NormalIndex.push_back(v3); } if((index==-1)||(index-first 1)){ sscanf_s(buf, %d;%d,%d,%d,%d;, , dammy, v1, v2, v3, v4); NormalIndex.push_back(v1); NormalIndex.push_back(v2); NormalIndex.push_back(v3); NormalIndex.push_back(v4); } } } //マテリアルリスト if(strcmp(key, MeshMaterialList )==0) { Hierarchy++; fgets(buf,sizeof(buf), fp);//空改行 fgets(buf,sizeof(buf), fp);//マテリアル数 fgets(buf,sizeof(buf), fp);//リスト要素数 Count=atoi(buf); for(int i=0;i { fgets(buf,sizeof(buf), fp); int test=atoi(buf); MaterialIndex.push_back(test); } } //マテリアル読み込み if(strcmp(key, Material )==0) { Hierarchy++; fgets(buf,sizeof(buf), fp);//直後の行にあると推定 改行する //ディフューズ fscanf_s( fp, %f;%f;%f;%f;; , vec4d.x, vec4d.y, vec4d.z, vec4d.w); mtl.MaterialColor.diffuse=(const Color4 )vec4d; //SHININESS fscanf_s( fp, %f; , mtl.Shininess); //スペキュラー fscanf_s( fp, %f;%f;%f;; , vec4d.x, vec4d.y, vec4d.z); mtl.MaterialColor.specular=(const Color4 )vec4d; //エミッシブ fscanf_s( fp, %f;%f;%f;; , vec4d.x, vec4d.y, vec4d.z); mtl.MaterialColor.ambient=(const Color4 )vec4d; node.Mesh- Material.push_back(mtl); } } return false; } //フレーム読み込み bool HIERARCHY Load_Frame(FILE fp,NODE node,int hierarchy){ char key[255]; int begin=0,end=0; int current=hierarchy;//現在の階層 int file_pos; while(!feof( fp)) { //キーワード 読み込み ZeroMemory(key,sizeof(key)); fscanf_s( fp, %s ,key,sizeof(key)); //ヘッダー読み飛ばし if(strcmp(key, Header )==0){ while(strcmp(key, } )){ fscanf_s( fp, %s ,key,sizeof(key)); } continue; } //テンプレート読み飛ばし if(strcmp(key, template )==0){ while(strcmp(key, } )){ fscanf_s( fp, %s ,key,sizeof(key)); } continue; } //階層+ if(strcmp(key, { )==0){ begin++; } //階層- if(strcmp(key, } )==0){ end++; } //フレーム if(strcmp(key, Frame )==0){ fscanf_s( fp, %s ,key,sizeof(key)); if(((begin==0) (end==0))||(end-begin==-1)){//子ノード追加 node.Node=new NODE(nde); node.Node- FrameName=key; file_pos=ftell( fp); Load_Mesh(fp,*node.Node); fseek( fp, file_pos, SEEK_SET ); hierarchy++; Load_Frame(fp,*node.Node,hierarchy);//再帰呼び出し } if(Back==current){//階層戻り先にきた場合、同一階層追加 Back=-1; node.Next=new NODE(nde); node.Next- FrameName=buffer; file_pos=ftell( fp); Load_Mesh(fp,*node.Next); fseek( fp, file_pos, SEEK_SET ); Load_Frame(fp,*node.Next,current);//再帰呼び出し } if(end-begin 0){// } が { より多い時は階層を戻る strcpy_s(buffer,255,key); Back=current-(end-begin); return true; } if((end-begin==0) ((begin!=0) (end!=0))){//同一階層追加 node.Next=new NODE(nde); node.Next- FrameName=key; file_pos=ftell( fp); Load_Mesh(fp,*node.Next); fseek( fp, file_pos, SEEK_SET ); Load_Frame(fp,*node.Next,current);//再帰呼び出し } //階層を戻る if((Back!=-1) (Back } } return true; } //階層メッシュ読み込み bool HIERARCHY Load_Hierarchy(char* FileName){ //Xファイルを開いて内容を読み込む Back=-1; int Hierarchy=0; FILE* fp=NULL; fopen_s( fp,FileName, rt ); //読み込み fseek(fp,0,SEEK_SET); Load_Frame(*fp,Root,Hierarchy); fseek(fp,0,SEEK_SET); Load_Animation(*fp); fclose(fp); return true; } main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #include xfile.h #include font.h #define WIDTH 320 #define HEIGHT 240 float angle=0.0f; HIERARCHY* hierarchy; GLFONT *font; wstring wstr; wchar_t wchar[255]; int CurrentFrame; void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glViewport(0,0,WIDTH,HEIGHT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(30.0, WIDTH/HEIGHT, 0.1, 2000.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0.0, 1000.0, 1000.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); //階層アニメーション hierarchy- Animation_Draw(0,CurrentFrame); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glOrtho(0, WIDTH, HEIGHT, 0, -1, 1); glColor4f(1.0f, 1.0f, 1.0f, 1.0f); wstr=L 最大フレーム[ ; _itow_s(hierarchy- Animation_MaxFrame,wchar,255,10); wstr+=wchar; wstr+=L ] ; font- DrawStringW(0,16,(wchar_t *)wstr.c_str()); wstr=L 現在のフレーム[ ; _itow_s(CurrentFrame,wchar,255,10); wstr+=wchar; wstr+=L ] ; font- DrawStringW(0,32,(wchar_t *)wstr.c_str()); glutSwapBuffers(); } void idle(void) { if(hierarchy- Animation_MaxFrame CurrentFrame)CurrentFrame=0; Sleep(1); glutPostRedisplay(); } //タイマー void timer(int value) { CurrentFrame+=30; glutTimerFunc(10 , timer , 0); } void Init(){ glClearColor(0.0, 0.0, 0.0, 1.0); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHT0); glEnable(GL_LIGHTING); glEnable(GL_CULL_FACE); glCullFace(GL_BACK); hierarchy = new HIERARCHY( sample3.x ,100); font = new GLFONT(L MS明朝 , 16); } int main(int argc, char *argv[]) { glutInitWindowPosition(100, 100); glutInitWindowSize(WIDTH, HEIGHT); glutInit( argc, argv); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); glutCreateWindow( Xの階層メッシュアニメーション読み込み ); glutDisplayFunc(display); glutIdleFunc(idle); glutTimerFunc(10 , timer , 0); Init(); glutMainLoop(); return 0; }
https://w.atwiki.jp/adamina/
@wikiへようこそ ウィキはみんなで気軽にホームページ編集できるツールです。 このページは自由に編集することができます。 メールで送られてきたパスワードを用いてログインすることで、各種変更(サイト名、トップページ、メンバー管理、サイドページ、デザイン、ページ管理、等)することができます まずはこちらをご覧ください。 @wikiの基本操作 用途別のオススメ機能紹介 @wikiの設定/管理 分からないことは? @wiki ご利用ガイド よくある質問 無料で会員登録できるSNS内の@wiki助け合いコミュニティ @wiki更新情報 @wikiへのお問合せフォーム 等をご活用ください @wiki助け合いコミュニティの掲示板スレッド一覧 #atfb_bbs_list その他お勧めサービスについて 大容量1G、PHP/CGI、MySQL、FTPが使える無料ホームページは@PAGES 無料ブログ作成は@WORDをご利用ください 2ch型の無料掲示板は@chsをご利用ください フォーラム型の無料掲示板は@bbをご利用ください お絵かき掲示板は@paintをご利用ください その他の無料掲示板は@bbsをご利用ください 無料ソーシャルプロフィールサービス @flabo(アットフラボ) おすすめ機能 気になるニュースをチェック 関連するブログ一覧を表示 その他にもいろいろな機能満載!! @wikiプラグイン @wiki便利ツール @wiki構文 @wikiプラグイン一覧 まとめサイト作成支援ツール バグ・不具合を見つけたら? 要望がある場合は? お手数ですが、お問合せフォームからご連絡ください。